#ifndef SOCKETWORKER_H
#define SOCKETWORKER_H

#include <QObject>
#include<QTimer>
#include<QFile>
#include<QFileInfo>
#include<QTcpSocket>
#include"Protocol.h"
class SocketWorker : public QObject
{
    Q_OBJECT
public:
    explicit SocketWorker(QObject *parent = nullptr);

    ~SocketWorker();


    QString curDirPath() const;
    void setCurDirPath(const QString &newCurDirPath);

    QString usrName() const;
    void setUsrName(const QString &newUsrName);

    QString password() const;
    void setPassword(const QString &newPassword);

signals:
    void sendTipMessage(int flag,QString parent,const QString&txt,int duration=1000);
    //flag=1:information
    //flag=2:warning
    //flag=3:critical
    void setProgressBarVal(int percent);
    void setProgessBarClosedEn(bool flag);
    void hideProgressBar();
    void showProgressBar();
    void setProgressBarTitle(const QString&title);
    void setStatusBar(const QString &msg);
    void logInSuccessSignal(QString name);
    void flushSearchPage();
    void sendSearchData(QList<UserInfo> resultList);
    void updateFriList(QMap<QString,QString>friendList);
    void sendPriChatMsg(const QString&chatName,const QString&msg);
    void sendGroupChatMsg(const QString&msg,const QString&timeText);
    void updateFileList(QMap<QString,int>list);

    void addFriendSignal(const QString&addName, const QString&usrName);

    void closeMainWinSignal();

    void sendOnlineFriendList(QList<QString> resultList);

    void handleShareFileSignal(const QString &usrName,const QString&filePath);
public slots:
    //刷新表格
    void flushTable();
    //上传文件
    void uploadFileData();
    //上线通知
    void onlineNotice();

    void connectToServer(const QString &ip, quint16 port);
    void usrRegister(const QString&usrName,const QString&password);
    void usrLogIn(const QString&usrName,const QString&password);
    void searchUsrByName(const QString&name);
    void addUsr(const QString&addName);
    void flushFriendList();
    void onlineFriendList();
    void shareFileToFriend(const QList<QString> &friendList,const QString &fileName);
    void deleteFriend(const QString &deleteName);
    void groupChatRquset(const QString &msg);
    void privateChatRequest(const QString&chatName,const QString&msg);
    void usrOffline();
    void createNewDir(const QString&dirName);
    void flushCurrentDir();
    void deleteDirFile(const QString& dir_FileName);
    void renameDirFile(const QString &oldName,const QString &newName);
    void entryRequest(const QString&dirName);
    void backDirRequest();
    void uploadFileRequest(const QString& upLoadFilePath);
    void downloadFileRequest(const QString& fileName,const QString& saveFilePath);
    void moveFileRequest(const QString& sourcePath,const QString& fileName,const QString& targetPath);

    //处理添加好友结果
    void handleAddFriendResult(bool isAgree,const QString&addName, const QString&usrName);
    void usrLogOff();

    //处理文件分享反馈
    void handleShareFileFeedBack(bool isAgree,const QString&path);

    //处理修改用户信息
    void handleModifyInfo(const QString& oldUsrName,const QString& newUsrName,const QString& newPwd);
private slots:
    void onReadyRead();

private:
    QTcpSocket *m_tcp = nullptr;

    //上传文件计时器
    QTimer *m_timer;

    //更新表格计时器
    QTimer *m_tableTimer;

    //广播上线计时器
    QTimer *m_onlineTimer;


    /**
     * 以下参数用于接收从服务器端下载的文件数据
     */

    //下载文件路径
    QString m_downLoadFilePath;
    //文件
    QFile  m_file;
    //下载文件状态
    bool m_downLoad;
    //文件总大小
    qint64 m_total;
    //文件已接收大小
    qint64 m_recved;

    /**
     * **********************************************************
     */

    //当前登录用户名
    QString m_usrName;
    //当前登录用户密码
    QString m_password;

    //当前文件路径
    QString m_curDirPath;

    //当前进入文件夹路径
    //进入新的文件夹时，才把该值赋给m_curDirPath
    QString m_entryPath;

    //用户文件夹根目录
    QString m_rootDirPath;

    //上传文件路径
    QString m_upLoadFilePath;

    //上传文件大小
    qint64 m_uploadFileSize;
};

#endif // SOCKETWORKER_H
